package extend.db.transaction;

import extend.db.DbConnection;

/**
 * 事务管理类
 * <B>说明：</B>
 * <pre>
 *  略
 * </pre>
 * <B>示例：</B>
 * <pre>
 *  略
 * </pre>
 * <B>日志：</B>
 * <pre>
 *  略
 * </pre>
 * <B>注意事项：</B>
 * <pre>
 *  略
 * </pre>
 */
public class Trans
{
    /**
     * 当前事务
     *<B>说明：</B>
     *<pre>
     *  每创建一个新的线程都创建对应的变量副本
     *</pre>
     */
    static ThreadLocal<Transaction> trans = new ThreadLocal<>();

    /**
     * 事务是否开启
     *<B>说明：</B>
     *<pre>
     *  beginTransaction 此方法会自动设置此状态
     *</pre>
     */
    static ThreadLocal<Boolean> transactionOn = new ThreadLocal<>();

    /**
     * 开启事务
     *<B>说明：</B>
     *<pre>
     *  只是标注一个状态而已,无需连接数据库
     *  如上次事务未提交,则开启新事务之前,先提交
     *</pre>
     */
    public static boolean beginTransaction()
    {
        Transaction transaction = trans.get();
        if (transaction == null) {
            transaction = new DbTransaction();
            trans.set(transaction);
            transactionOn.set(true);
        }

        return trans.get().beginTransaction();
    }

    /**
     * 提交事务
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static boolean commit()
    {
        boolean result = trans.get().commit();
        if (result) {
            clearTrans();
        }

        return result;
    }

    /**
     * 回滚事务
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static boolean rollback()
    {
        boolean result = trans.get().rollback();
        if (result) {
            clearTrans();
        }

        return result;
    }

    /**
     * 添加当前db 连接至当前事务池
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static boolean addTransDb(String dbConnKey, DbConnection dbConnection)
    {
        boolean result = dbConnection.beginTransaction();
        if (result == true) {
            trans.get().addTransDb(dbConnKey,dbConnection);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取事务状态
     *<B>说明：</B>
     *<pre>
     *  是否开启事务
     *</pre>
     */
    public static boolean transOn()
    {
        Boolean transOn = transactionOn.get();
        if (transOn == null || transOn == false) {
            return false;
        }

        return true;
    }

    private static boolean clearTrans()
    {
        transactionOn.set(false);
        return false;
    }



}
